from datetime import datetime
import cnlunar
import logging
import re
from plugins_func.register import register_function, ToolType, ActionResponse, Action
from core.handle.sendAudioHandle import send_topic_message,send_stt_message
from core.utils.dialogue import Message
from core.providers.tts.dto.dto import TTSMessageDTO, SentenceType, ContentType
from core.handle.cacheModule import shared_cache


logger = logging.getLogger(__name__)
# 函数描述 - 更清晰地定义参数和功能
chuli_zl_function_desc = {
    "type": "function",
    "function": {
        "name": "equipment_zl",
        "description": "用户控制按摩设备启停以及设备加热开关",
        "parameters": {
            "type": "object",
            "properties": {
                "query": {
                    "type": "string",
                    "description": "需要控制设备的命令，可以是启动按摩、停止按摩、打开加热、关闭加热、加热开、加热关,如果未指定就填None",
                }
            },
            "required": ["query"],
        },
    },
}


@register_function("equipment_zl", chuli_zl_function_desc, ToolType.TOPIC_CTL)
def equipment_zl(conn,query=None, intensity=None):
    """
    处理按摩设备命令请求，包括设备启停、设备加热开关和命令确认
    
    参数:
        query: 包含按摩设备的用户请求
    """
    print('当前说话人和按摩的人是同一个吗',conn.current_speaker == shared_cache.get("speaker"))
    # 验证用户权限
    auth_result, auth_message = _validate_user_permission(conn)
    if not auth_result:
        return ActionResponse(Action.RESPONSE, "权限验证失败", auth_message)
    # 配置允许的按摩部位及友好提示
    ALLOWED_PARTS = {"启动按摩", "停止按摩", "打开加热","关闭加热","开始建图"}
    PART_PROMPT = ", ".join(ALLOWED_PARTS)
    
    # 处理空查询
    if not query or not query.strip():
        return ActionResponse(
            Action.REQLLM, 
            f"抱歉，目前只支持{PART_PROMPT}的命令，其他小易还没学习呢。", 
            None
        )
    
    # 提取按摩设备（支持更复杂的输入）
    # 使用正则匹配允许的部位，提高识别准确性
    part_match = re.search(rf"({'|'.join(ALLOWED_PARTS)})", query)
    part = part_match.group(1) if part_match else None
    
    
    # 验证按摩设备
    if not part or part not in ALLOWED_PARTS:
        return ActionResponse(
            Action.REQLLM, 
            f"抱歉，目前只支持{PART_PROMPT}的命令，其他小易还没学习呢。", 
            None
        )
    

    # 确认服务（这里可以添加实际控制设备的逻辑）
    text=f"好的，已为您{part}!如需调整，请随时告知。"
        
    conn.loop.create_task(
            sttMessage(conn, text,'topic_equipment')  # 封装异步逻辑
        )
    return ActionResponse(
            Action.REQLLM, 
            text, 
            None
        )


def _validate_user_permission(conn):
    """验证用户是否有权限控制按摩设备"""
    speaker = shared_cache.get("speaker")
    if speaker is None:
        logger.warning("未检测到开机用户")
        return False, "抱歉，请先扫码开机按摩"
        
    if conn.current_speaker != speaker:
        logger.warning(f"用户权限验证失败: 开机按摩用户={speaker}, 识别到的用户={conn.current_speaker}")
        str_=f"抱歉{conn.current_speaker},我在帮别人按摩，我不能听你的。"
        if(speaker=='不可靠说话人'):
            str_="抱歉，你不是按摩客人，我不能听你的。"
        if(speaker=='未知说话人'):
            str_="抱歉，我不认识您，我不能听你的。"
        return False, str_

        
    return True, ""
    
async def sttMessage(conn, text,type):
    await send_topic_message(conn, text,type)


